From 6fb728354fcc0e3aef283901e2517290a1ab8162 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Bj=C3=B6rn=20Steinbrink?= Date: Mon, 29 Sep 2014 14:41:52 +0200 Subject: [PATCH] Use the new Entry API for HashMaps --- src/cargo/core/resolver.rs | 15 +++++++++------ src/cargo/ops/cargo_rustc/context.rs | 8 +++++--- src/cargo/ops/cargo_rustc/fingerprint.rs | 7 +++++-- src/cargo/ops/cargo_rustc/job_queue.rs | 7 +++++-- src/cargo/util/config.rs | 10 +++++----- src/cargo/util/dependency_queue.rs | 6 +++++- src/cargo/util/graph.rs | 9 +++++---- 7 files changed, 39 insertions(+), 23 deletions(-) diff --git a/src/cargo/core/resolver.rs b/src/cargo/core/resolver.rs index efc9adb89..f47aa7055 100644 --- a/src/cargo/core/resolver.rs +++ b/src/cargo/core/resolver.rs @@ -1,4 +1,5 @@ use std::collections::{HashMap, HashSet}; +use std::collections::hashmap::{Occupied, Vacant}; use std::fmt; use semver; @@ -323,16 +324,18 @@ fn resolve_deps<'a, R: Registry>(parent: &Summary, // Record what list of features is active for this package. { let pkgid = parent.get_package_id().clone(); - let features = ctx.resolve.features.find_or_insert(pkgid, - HashSet::new()); - features.extend(used_features.into_iter()); + match ctx.resolve.features.entry(pkgid) { + Occupied(entry) => entry.into_mut(), + Vacant(entry) => entry.set(HashSet::new()), + }.extend(used_features.into_iter()); } // Recursively resolve all dependencies for &dep in deps.iter() { - if !ctx.resolved.find_or_insert(parent.get_package_id().clone(), - HashSet::new()) - .insert(dep.get_name().to_string()) { + if !match ctx.resolved.entry(parent.get_package_id().clone()) { + Occupied(entry) => entry.into_mut(), + Vacant(entry) => entry.set(HashSet::new()), + }.insert(dep.get_name().to_string()) { continue } diff --git a/src/cargo/ops/cargo_rustc/context.rs b/src/cargo/ops/cargo_rustc/context.rs index 4b3531cd1..cba02feff 100644 --- a/src/cargo/ops/cargo_rustc/context.rs +++ b/src/cargo/ops/cargo_rustc/context.rs @@ -1,4 +1,5 @@ use std::collections::{HashMap, HashSet}; +use std::collections::hashmap::{Occupied, Vacant}; use std::str; use core::{SourceMap, Package, PackageId, PackageSet, Resolve, Target}; @@ -167,9 +168,10 @@ impl<'a, 'b> Context<'a, 'b> { let key = (pkg.get_package_id(), target.get_name()); let req = if target.get_profile().is_plugin() {PlatformPlugin} else {req}; - self.requirements.insert_or_update_with(key, req, |_, v| { - *v = v.combine(req); - }); + match self.requirements.entry(key) { + Occupied(mut entry) => { *entry.get_mut() = entry.get().combine(req); } + Vacant(entry) => { entry.set(req); } + }; for &(pkg, dep) in self.dep_targets(pkg).iter() { self.build_requirements(pkg, dep, req, visiting); diff --git a/src/cargo/ops/cargo_rustc/fingerprint.rs b/src/cargo/ops/cargo_rustc/fingerprint.rs index 37b146653..c0ca783c3 100644 --- a/src/cargo/ops/cargo_rustc/fingerprint.rs +++ b/src/cargo/ops/cargo_rustc/fingerprint.rs @@ -1,3 +1,4 @@ +use std::collections::hashmap::{Occupied, Vacant}; use std::hash::{Hash, Hasher}; use std::hash::sip::SipHasher; use std::io::{fs, File, UserRWX, BufferedReader}; @@ -100,8 +101,10 @@ pub fn prepare_target(cx: &mut Context, pkg: &Package, target: &Target, cx.compilation.binaries.push(dst.clone()); } else if target.is_lib() { let pkgid = pkg.get_package_id().clone(); - cx.compilation.libraries.find_or_insert(pkgid, Vec::new()) - .push(root.join(filename)); + match cx.compilation.libraries.entry(pkgid) { + Occupied(entry) => entry.into_mut(), + Vacant(entry) => entry.set(Vec::new()), + }.push(root.join(filename)); } } } diff --git a/src/cargo/ops/cargo_rustc/job_queue.rs b/src/cargo/ops/cargo_rustc/job_queue.rs index 6372acaf8..6c05c7df7 100644 --- a/src/cargo/ops/cargo_rustc/job_queue.rs +++ b/src/cargo/ops/cargo_rustc/job_queue.rs @@ -1,4 +1,5 @@ use std::collections::HashMap; +use std::collections::hashmap::{Occupied, Vacant}; use term::color::YELLOW; use core::{Package, PackageId, Resolve}; @@ -73,8 +74,10 @@ impl<'a, 'b> JobQueue<'a, 'b> { // Record the freshness state of this package as dirty if any job is // dirty or fresh otherwise let fresh = jobs.iter().fold(Fresh, |f1, &(_, f2)| f1.combine(f2)); - let prev = self.state.find_or_insert(pkg.get_package_id(), fresh); - *prev = prev.combine(fresh); + match self.state.entry(pkg.get_package_id()) { + Occupied(mut entry) => { *entry.get_mut() = entry.get().combine(fresh); } + Vacant(entry) => { entry.set(fresh); } + }; // Add the package to the dependency graph self.queue.enqueue(&self.resolve, Fresh, diff --git a/src/cargo/util/config.rs b/src/cargo/util/config.rs index 5610369af..0cf39c770 100644 --- a/src/cargo/util/config.rs +++ b/src/cargo/util/config.rs @@ -1,6 +1,7 @@ use std::{fmt, os, mem}; use std::io::fs::{PathExtensions, File}; use std::collections::HashMap; +use std::collections::hashmap::{Occupied, Vacant}; use std::string; use serialize::{Encodable,Encoder}; @@ -167,11 +168,10 @@ impl ConfigValue { (&Table(ref mut old), Table(ref mut new)) => { let new = mem::replace(new, HashMap::new()); for (key, value) in new.into_iter() { - let mut err = Ok(()); - old.find_with_or_insert_with(key, value, - |_, old, new| err = old.merge(new), - |_, new| new); - try!(err); + match old.entry(key) { + Occupied(mut entry) => { try!(entry.get_mut().merge(value)); } + Vacant(entry) => { entry.set(value); } + }; } } (expected, found) => { diff --git a/src/cargo/util/dependency_queue.rs b/src/cargo/util/dependency_queue.rs index 8bad65533..a07c598ef 100644 --- a/src/cargo/util/dependency_queue.rs +++ b/src/cargo/util/dependency_queue.rs @@ -5,6 +5,7 @@ //! it to figure out when a dependency should be built. use std::collections::{HashMap, HashSet}; +use std::collections::hashmap::{Occupied, Vacant}; use std::hash::Hash; pub struct DependencyQueue { @@ -79,7 +80,10 @@ impl, V> DependencyQueue { let mut my_dependencies = HashSet::new(); for dep in key.dependencies(cx).into_iter() { assert!(my_dependencies.insert(dep.clone())); - let rev = self.reverse_dep_map.find_or_insert(dep, HashSet::new()); + let rev = match self.reverse_dep_map.entry(dep) { + Occupied(entry) => entry.into_mut(), + Vacant(entry) => entry.set(HashSet::new()), + }; assert!(rev.insert(key.clone())); } assert!(self.dep_map.insert(key, (my_dependencies, value))); diff --git a/src/cargo/util/graph.rs b/src/cargo/util/graph.rs index 63e5a9ec3..b83e4a8e9 100644 --- a/src/cargo/util/graph.rs +++ b/src/cargo/util/graph.rs @@ -1,7 +1,7 @@ use std::fmt; use std::hash::Hash; use std::collections::{HashMap, HashSet}; -use std::collections::hashmap::{Keys, SetItems}; +use std::collections::hashmap::{Keys, Occupied, SetItems, Vacant}; pub struct Graph { nodes: HashMap> @@ -25,9 +25,10 @@ impl Graph { } pub fn link(&mut self, node: N, child: N) { - self.nodes - .find_or_insert_with(node, |_| HashSet::new()) - .insert(child); + match self.nodes.entry(node) { + Occupied(entry) => entry.into_mut(), + Vacant(entry) => entry.set(HashSet::new()), + }.insert(child); } pub fn get_nodes(&self) -> &HashMap> { -- 2.30.2